package org.jeecg.modules.app.shopmember.service.impl;

import org.jeecg.common.api.vo.Result;
import org.jeecg.common.util.DateUtils;
import org.jeecg.common.util.RedisUtil;
import org.jeecg.modules.app.shopmember.service.AppShopDetailsService;
import org.jeecg.modules.power.device.mapper.YlDeviceMapper;
import org.jeecg.modules.power.order.mapper.YlPowerBankOrderMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @BelongsProject: jeecg-boot-parent
 * @BelongsPackage: org.jeecg.modules.app.shopmember.service.impl
 * @Author: mi
 * @CreateTime: 2024-08-13 09:24
 * @Description:
 */
@Service
public class AppShopDetailsServiceImpl implements AppShopDetailsService {




    @Autowired
    private RedisUtil redisUtil;//redis


    @Autowired
    private  YlPowerBankOrderMapper ylPowerBankOrderMapper; //订单

    @Autowired
    private  YlDeviceMapper ylDeviceMapper;//设备



    /**收益及订单
     总收益
     指不同时间段内的门店收益金额
     总订单:
     指不同时间段内门店收款订单数
     单柜收益:
     1.指(某时段柜机充电收益+某时段卖宝收益)/某时段机柜数
     2.柜机数剔除买断和长期报备的设备
     柜机单宝收益:
     1.指(某时段柜机充电收益+某时段卖宝收益)/某时段柜机理论宝数之和
     2.柜机数剔除买断和长期报备的设备
     时间维度说明:
     1.今日数据实时更新
     2.昨目数据每日凌晨0点左右更新
     3.近7天数据指昨日往前7天，不包括今日;每日凌晨0点左右更新
     4.本日数据指本月1号主当前时刻，数据实时更新
     5.近6个月指上月往前6个日，不包含本月，数据(趋
     势图、数据表)仅包含门店归属于当前主体所产生
     的收益及订单;每日凌晨0点左右更新
     * 门店详情 -进入统计模块-数据
     * @param id 店铺id
     * @param type 1 今日  2昨日 3近7天 4本月
     * @return
     */
    @Override
    public Result<?> getShopIdData(String id,Integer type) {
        //获取 更新时间   数据 今日  昨日 近7天 本月
        Map<String, Object> map=new HashMap();
        String key= "getShopIdData"+id+type;//缓存key
        Object object = redisUtil.get(key);
        if (object != null) {
            map=Map.class.cast(object);
            return Result.OK(map);
        }
        if (type==2){//昨天
            Date date= DateUtils.addDaysToDate(new Date(),-1);//取出昨天
            SimpleDateFormat formats = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            //获取更新时间
            map.put("payTime",formats.format(date));

        }else {
            SimpleDateFormat formats = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            //获取更新时间
            map.put("payTime",formats.format(new Date()));
        }

        //求出订单数 和收益数  getShopIdData
        Map<String, Object>    shopIdDataMap =ylPowerBankOrderMapper.getShopIdData(id,type);
        Integer orderQuantity= Integer.parseInt(shopIdDataMap.get("quantity").toString());//订单数量
        String orderPrice=shopIdDataMap.get("orderPrice").toString();//订单收益
        //得出 总收益 总订单
        map.put("orderQuantity",orderQuantity);
        map.put("orderPrice",orderPrice);
        //如果 店铺没有设备 单柜收益 柜机单宝收益 都都展示--
        //获取 店铺下的机柜设备数 和 机柜设备 仓口数
        //求出   单柜收益  订单收益 除以 机柜设备   柜机单包收益   订单收益 除以 机柜设备 仓口数
        Map<String, Object> stringObjectMap=ylDeviceMapper.getShopIdDeviceQuantity(id);
        Integer deviceQuantity= Integer.parseInt(stringObjectMap.get("quantity").toString());//设备数量
        Integer fullNumber= Integer.parseInt(stringObjectMap.get("fullNumber").toString());//仓孔数
        if (0==deviceQuantity){
            map.put("cupboardPrice","--");//单柜收益
            map.put("powerPrice","--");//柜机单宝收益
        }else {
            if (0==orderQuantity){
                map.put("cupboardPrice","0.00");//单柜收益
                map.put("powerPrice","0.00");//柜机单宝收益
            }else {
                //说明有订单 收益
                BigDecimal dg=new BigDecimal(orderPrice).divide(new BigDecimal(deviceQuantity),2,BigDecimal.ROUND_HALF_UP);
                map.put("cupboardPrice",dg);//单柜收益
                BigDecimal db=new BigDecimal(orderPrice).divide(new BigDecimal(fullNumber),2,BigDecimal.ROUND_HALF_UP);
                map.put("powerPrice",db);//柜机单宝收益
            }
        }
        redisUtil.set(key, map, 300);
        return Result.OK(map);
    }


    /**
     * 门店详情 -进入统计模块-数据 及数据
     * @param id 店铺id
     * @param type 1 近30天 （不包括今日）   2 近6个月  近6个月指上月往前6个日，不包含本月
     * @return
     */
    @Override
    public Result<?> getShopIdDataLineChart(String id, Integer type) throws ParseException {
        Date date= DateUtils.addDaysToDate(new Date(),-1);//取出昨天
        SimpleDateFormat formats = new SimpleDateFormat("yyyy-MM-dd");
        String zDays= formats.format(date);//昨天

     if (type==1){//近30天
         Date thirtyDate= DateUtils.addDaysToDate(date,-30);//取出前30的日期
         String thirtyDays= formats.format(thirtyDate);//昨天
         List<Map<String,Object>> shopIdThirtyDate= ylPowerBankOrderMapper.getShopIdThirtyDate(id,thirtyDays+" 00:00:00", zDays+" 23:59:59");
         List<String> daysList= DateUtils.rangeDates(thirtyDays,zDays);//求出时间范围
         List<Map<String,Object>>  orderLineChartList=new ArrayList<>();

         for (String day : daysList) {
             Map dayMap=new HashMap();
//             String[] s=  day.split("-");
             dayMap.put("tian", day.replaceAll("-","."));
             if (shopIdThirtyDate.size()==0){
                 dayMap.put("orderQuantity",0);
                 dayMap.put("orderPrice","0");
             }else {
                 List<Map<String,Object>>  ifMap=  shopIdThirtyDate.stream().filter(m ->  m.get("type").toString() .equals(day) ).collect(Collectors.toList());
                 if (ifMap.size()>0){
                     dayMap.put("orderQuantity",ifMap.get(0).get("orderQuantity"));
                     dayMap.put("orderPrice",ifMap.get(0).get("orderPrice"));
                 }else {
                     dayMap.put("orderQuantity",0);
                     dayMap.put("orderPrice","0");
                 }
             }
             orderLineChartList.add(dayMap);
         }
         return Result.OK(orderLineChartList);
     }else {//近6个月  近6个月指上月往前6个月，包含本月

         //addMonthToDate
//         Date s= DateUtils.addMonthToDate(new Date(),-1);//取出上个月
//         System.out.println(formats.format(s)+"===上个月");
         Date date1=  new Date();//当前月
        //得到上个月 往前6个月
         Date monthToDate= DateUtils.addMonthToDate(date1,-6);//获取 6六个月钱的数据
//         System.out.println(formats.format(monthToDate)+"===起始月");

         SimpleDateFormat yue = new SimpleDateFormat("yyyy-MM");
         //组装月份数据
         List<String> yueStrList=new LinkedList<>();
         int j=6;
         for ( int i=0;i<j;i++){
             Integer y=i;
             Date month= DateUtils.addMonthToDate(date1,-y);//获取 6六个月钱的数据
             yueStrList.add(yue.format(month));
         }
//         System.out.println(yueStrList.stream().sorted().collect(Collectors.toList())+"==排序");
         //getShopIdMonthDate
         List<String> yueList=yueStrList.stream().sorted().collect(Collectors.toList());//排序后的数据
         //拼接开始 时间 字符串
         String dayStart=yueList.get(0)+"-01 00:00:00";
//         System.out.println(dayStart+"==dayStart");

         List<Map<String,Object>> shopIdYueDate=  ylPowerBankOrderMapper.getShopIdMonthDate(id, dayStart, zDays+" 23:59:59");

         List<Map<String,Object>>  orderLineChartList=new ArrayList<>();

         for (String day : yueList) {
//             String[] s=  day.split("-");
             Map yueMap=new HashMap();
             yueMap.put("tian",day);
             List<Map<String,Object>>  ifMap=  shopIdYueDate.stream().filter(y ->  y.get("type").toString() .equals(day) ).collect(Collectors.toList());
             if (ifMap.size()>0){
                 yueMap.put("orderQuantity",ifMap.get(0).get("orderQuantity"));
                 yueMap.put("orderPrice",ifMap.get(0).get("orderPrice"));
             }else {
                 yueMap.put("orderQuantity",0);
                 yueMap.put("orderPrice","0");
             }
             orderLineChartList.add(yueMap);
         }
         return Result.OK(orderLineChartList);
     }
//        return Result.OK();




    }
}
